package com.midian.common.pay.tenpay.xmlutil;

import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.log4j.Logger;

import com.midian.common.pay.tenpay.util.ConstantUtil;
import com.midian.common.utils.StringUtil;


/** 
 * 封装最终的xml格式结果 
 * @author Darling
 * 
 */  
public abstract class FormatXmlProcess {
	
	private static Logger LOG = Logger.getLogger(FormatXmlProcess.class);
	
    /**
     * 封装请求统一下单数据
     * @param params 
     * @return
     */
    public static String formatXmlRequestPrepay(Map<String,String> params){
		SortedMap<String, Object> sortMap = new TreeMap<String, Object>();
    	sortMap.put("appid", ConstantUtil.APP_ID);//appId
    	sortMap.put("mch_id",ConstantUtil.PARTNER);//商户号
    	sortMap.put("nonce_str", params.get("nonceStr"));//随机字符串
    	//LOG.error("nonce_str: " + params.get("nonceStr"));
    	
    	sortMap.put("body", params.get("item"));//商品描述 
    	//LOG.error("body: " + params.get("item"));
    	
    	sortMap.put("out_trade_no", params.get("orderSn"));//订单号
    	//LOG.error("out_trade_no: " + params.get("orderSn"));
    	
    	Double d = Double.parseDouble(params.get("total")) * 100;
    	sortMap.put("total_fee",d.intValue());//总金额（由于微信的单位是分，所以要乘以100）
    	//LOG.error("total_fee: " + d.intValue());
    	
    	sortMap.put("spbill_create_ip", params.get("ip"));//终端IP
    	//LOG.error("spbill_create_ip: " + params.get("ip"));
    	
    	sortMap.put("time_start", params.get("createTime"));//订单生成时间20150327102536
    	//LOG.error("time_start: " + params.get("createTime"));
    	
    	sortMap.put("notify_url", params.get("notifyUrl"));//回调通知地址
    	//LOG.error("notify_url: " + params.get("notifyUrl"));
    	
    	sortMap.put("trade_type", "APP");//交易类型
    	String sign = StringUtil.createSign(sortMap);//签名
    	sortMap.put("sign", sign);//签名
    	return sortedMapToXmlString(sortMap); 
    }
    
    /**
     * 回调返回的xml数据
     * @param code 返回状态吗
     * @param msg 返回信息
     * @return
     */
    public static String formatXmlResponseNotify(String code, String msg){
    	StringBuffer sb = new StringBuffer();
    	 sb.append("<xml><return_code><![CDATA[");
    	 sb.append(code);
    	 sb.append("]]></return_code><return_msg><![CDATA[");
    	 sb.append(msg);
    	 sb.append("]]></return_msg></xml>"); 
    	return sb.toString(); 
    }
  /**
   * 封装订单查询请求数据
   * @param params
   * @return
   */
    public static String formatXmlOrderQuery(Map<String,String> params){
    	SortedMap<String,Object> sortMap=new TreeMap<String,Object>();
    	sortMap.put("appid", ConstantUtil.APP_ID);//appId
    	sortMap.put("mch_id",ConstantUtil.PARTNER);//商户号
    	sortMap.put("nonce_str", StringUtil.getRandomString(32));//随机字符串
    	//	sortMap.put("transaction_id", params.get("thirdOrderNo"));//微信订单号
    	sortMap.put("out_trade_no", params.get("orderSn"));//商户订单号
    	String sign = StringUtil.createSign(sortMap);//签名
    	sortMap.put("sign", sign);
    	return sortedMapToXmlString(sortMap); 
    }
    /**
     * 封装退款订单查询数据
     * @param params
     * @return
     */
    public static String formatXmlRefundQuery(Map<String,String> params){
        	SortedMap<String,Object> sortMap=new TreeMap<String,Object>();
        	sortMap.put("appid", ConstantUtil.APP_ID);//appId
        	sortMap.put("mch_id",ConstantUtil.PARTNER);//商户号
        	sortMap.put("device_info", "WEB");//设备号
        	sortMap.put("nonce_str", StringUtil.getRandomString(32));//随机字符串
        //	sortMap.put("transaction_id", params.get("thirdOrderNo"));//微信订单号
        	sortMap.put("out_trade_no", params.get("orderSn"));//商户订单号
        	sortMap.put("out_refund_no", params.get("rufundSn"));//商户退款单号
        	sortMap.put("refund_id", params.get("thirdRefundSn"));//微信退款单号
        	String sign = StringUtil.createSign(sortMap);//签名
        	sortMap.put("sign", sign);
        	return sortedMapToXmlString(sortMap); 
    }
    /**
     * 封装关闭订单数据
     * @param orderNo 商店订单号
     * @return
     */
    public static String formatXmlcloseorder(String orderNo){
    	SortedMap<String,Object> sortMap=new TreeMap<String,Object>();
    	sortMap.put("appid", ConstantUtil.APP_ID);//appId
    	sortMap.put("mch_id",ConstantUtil.PARTNER);//商户号
    	sortMap.put("nonce_str", StringUtil.getRandomString(32));//随机字符串
    	sortMap.put("out_trade_no", orderNo);//商户订单号
    	String sign = StringUtil.createSign(sortMap);//签名
    	sortMap.put("sign", sign);
    	return sortedMapToXmlString(sortMap); 
    }
    /**
     * 有序map转为xml字符串
     * @param sortMap
     * @return
     */
    private static String sortedMapToXmlString(SortedMap<String,Object> sortMap){
    	StringBuffer sb = new StringBuffer();
    	sb.append("<xml>");
    	for (Map.Entry<String, Object> entry : sortMap.entrySet()) {
    		if(entry.getValue() instanceof String){
    			sb.append("<"+entry.getKey()+"><![CDATA[");
    			sb.append(entry.getValue());
    			sb.append("]]></"+entry.getKey()+">");
    		}else if(entry.getValue() instanceof Integer){
    			sb.append("<"+entry.getKey()+">");
    			sb.append(((Number)entry.getValue()).intValue());
    			sb.append("</"+entry.getKey()+">");
    		}
    	}
    	sb.append("</xml>");
    	return sb.toString(); 
    }
}
